#include "Compresor"

Compresor::Compresor(obitstream *os): archivoComoBits(*os) {
	contUnderflow = 0;
}

void Compresor::procesarBit(bool bit) {
	archivoComoBits.put(bit); //printf("guardo bit: %i\n",bit);
	procesarUnderflow(!bit);
}

void Compresor::renormalizar() {
	register bool continuar = true;
	while (continuar) {
        if (this->convergioAlTecho()||this->convergioAlPiso()) {
			this->procesarBit(this->convergioAlTecho());
			this->renormalizarMaxBit();
		} else if(this->hayUnderflow()) {
			this->corregirUnderflow();
			this->contUnderflow++;
		} else {
			//esta normalizado
			continuar = false;
			// Mostrar los datos para ver como va la cosa
			//printf("Techo: %d, piso: %d\n",this->_techo, this->_piso);
		}
	}
}

void Compresor::procesarResultArit() {

	// Guardo el techo, no el piso, porque cuando llego hasta aca, SIEMPRE es en el EOF, y quiero emitir 9 ESC
	// Tomo como si convergiera al techo para guardar los underflow
	int i;
	ushort in = 0;
	in = ((this->techo() >> (USHORT_BIT-1))&1);
	//archivoComoBits.put((bool)in);
	this->procesarBit((bool)in);	// Acá guardo los underflow que me quedaban pendientes
	for(i=1;i<USHORT_BIT;i++)
	{
		in = ((this->techo() >> ((USHORT_BIT-1)-i))&1);
		archivoComoBits.put((bool)in); //printf("guardo bit: %i\n",in);
	}
}


void Compresor::procesarUnderflow(bool bitIndicador) {
	for (unsigned i = 0; i<this->contUnderflow;i++)
	{
		archivoComoBits.put(bitIndicador);  //printf("guardo bit: %i\n",bitIndicador);
	}
	this->contUnderflow = 0;
}


